/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fr.afcepf.projet2.facade.orchestre;


import fr.afcepf.projet2.facade.catalogue.Catalogue;
import fr.afcepf.projet2.facade.catalogue.Categorie;
import fr.afcepf.projet2.facade.catalogue.Produit;
import fr.afcepf.projet2.facade.exceptions.ExceptionCatalogue;
import fr.afcepf.projet2.facade.exceptions.ExceptionCategorie;
import fr.afcepf.projet2.facade.exceptions.ExceptionProduit;
import fr.afcepf.projet2.facade.exceptions.ExceptionSiteInconnu;
import fr.afcepf.projet2.facade.serviceweb.catalogue.CategorieDto;
import fr.afcepf.projet2.facade.serviceweb.catalogue.ProduitDto;
import fr.afcepf.projet2.facade.serviceweb.catalogue.WsCatalogue;
import fr.afcepf.projet2.facade.serviceweb.catalogue.WsCatalogue_Service;
import fr.afcepf.projet2.facade.serviceweb.commandes.WsCommandes_Service;
import fr.afcepf.projet2.facade.serviceweb.comptes.AdresseDto;
import fr.afcepf.projet2.facade.serviceweb.comptes.CiviliteDto;
import fr.afcepf.projet2.facade.serviceweb.comptes.InformationManquanteException_Exception;
import fr.afcepf.projet2.facade.serviceweb.comptes.MotDePasseIncorrectException_Exception;
import fr.afcepf.projet2.facade.serviceweb.comptes.TypeUtilisateurDto;
import fr.afcepf.projet2.facade.serviceweb.comptes.UtilisateurDto;
import fr.afcepf.projet2.facade.serviceweb.comptes.UtilisateurInexistantException_Exception;
import fr.afcepf.projet2.facade.serviceweb.comptes.WsComptes;
import fr.afcepf.projet2.facade.serviceweb.comptes.WsComptes_Service;
import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.xml.ws.BindingType;
import javax.xml.ws.WebServiceRef;

/**
 *
 * @author leshauts
 */
@WebService(serviceName = "WsFacade")
@Stateless()
@BindingType(value=javax.xml.ws.soap.SOAPBinding.SOAP11HTTP_MTOM_BINDING)  
public class WsFacade {

    @WebServiceRef(wsdlLocation = "META-INF/wsdl/localhost_8080/WsCommandes/WsCommandes.wsdl")
//    @WebServiceRef(wsdlLocation = "META-INF/wsdl/pc-afc1614_8080/WsCommandes/WsCommandes.wsdl")
    private WsCommandes_Service serviceCommande;
    // Serveur Distant
 //  @WebServiceRef(wsdlLocation = "META-INF/wsdl/pc-afc1614_8080/WsCatalogue/WsCatalogue.wsdl")
    @WebServiceRef(wsdlLocation = "META-INF/wsdl/localhost_8080/WsCatalogue/WsCatalogue.wsdl")
    private WsCatalogue_Service serviceCatalogue;    
    // Serveur Distant
//    @WebServiceRef(wsdlLocation = "META-INF/wsdl/pc-afc1614_8080/WsComptes/WsComptes.wsdl")
    @WebServiceRef(wsdlLocation = "META-INF/wsdl/localhost_8080/WsComptes/WsComptes.wsdl")
    private WsComptes_Service serviceComptes;


    /**
     * *************************************************************************
     **************************** PRIVATE
     * **************************************
     *************************************************************************
     */
    /**
     * verifie si le site nous est connu ou pas
     *
     * @param nomSite nom du site à controller
     * @throws ExceptionSiteInconnu si le site n'est pas reconnu
     */
    private void nameSiteInspector(String nomSite) throws ExceptionSiteInconnu {
        //TODO faire la verif de la valeur
//        boolean isSiteOk="".equals(nomSite);
        if (nomSite == null) {
            throw new ExceptionSiteInconnu("nom du site absent");
        }
    }

    // ===========================================================
    //                  GESTION DU CATALOGUE
    // ===========================================================
/**
 * Création du catalogue du site
 * @param site site demandeur
 * @return catalogue
 * @throws ExceptionSiteInconnu
 * @throws ExceptionCatalogue 
 */
    @WebMethod(operationName = "creationCatalogue")
    public Catalogue creationCatalogue(
            @WebParam(name = "site") String site)
            throws ExceptionSiteInconnu, ExceptionCatalogue, 
            ExceptionCategorie {
            // Init du catalogue
            Catalogue catalogue = new Catalogue();
            // init de la liste des categorie du catalogue
            List<Categorie> listeCategorie 
                    = new ArrayList<>();
            // On recup les CategorieCatalogue
            List<CategorieDto> listeDtos 
                    = (List<CategorieDto>)listCategories(site);
            // On parcours la liste pour recupérer les produits de la catégorie
            for (CategorieDto categorieDto 
                    : listeDtos) {
                // On init la liste la les produit du catalogue
                List<Produit> listeProd = new ArrayList<>();
                // On recup la liste des produitDto de la categorie
                List<ProduitDto> listeProduitDto
                        = getProduitsByCategorie(categorieDto);
                // Pour tous les produitDto, on crée un produit du catalogue et on 
                // l'ajoute a la liste des produit de la categorie du catalogue
                for (ProduitDto produitDto
                        : listeProduitDto) {
                    Produit prod = new Produit(produitDto);
                    listeProd.add(prod);
                }
                // On creer une nouvelle categorie du catalogue (avec des attibut redéfini
                Categorie categorie = new Categorie(
                        categorieDto.getCategorie(),
                        categorieDto.getPhoto(),
                        categorieDto.getIdCategorie().intValue());
                // On ajout la liste des produit de la categorie du catalogue
                // dans la categorie en cours
                categorie.setListeProd(listeProd);
                // Ajout la categorie en cours (avec sa liste de produits)
                // dans le catalogue
                listeCategorie.add(categorie);
            }
            // On retourne la catalogue créer
            catalogue.setCategorie(listeCategorie);
            // Ca marche (tester et fonctionnel
            return catalogue;
    }
    // ===========================================================
    //           APPEL DES WEBSERVICES CATALOGUE
    // =============================================================

    /**
     * Obtient la liste des catégories
     * @param site site internet demandeur
     * @return liste des catégories du site
     * @throws ExceptionCategorie 
     */
    private List<CategorieDto> listCategories
            (final String site) throws ExceptionCategorie{
        WsCatalogue port = serviceCatalogue.getWsCataloguePort();
        List<CategorieDto> liste = port.listCategories(site);
        if (liste == null) {
            throw new ExceptionCategorie("liste de catégories null");
        }
        return liste;
    }

    /**
     * Obtient la liste des produits par catégorie
     * @param categorie
     * @return liste de produits
     * @throws ExceptionProduit 
     */
    private List<ProduitDto> getProduitsByCategorie(
            final CategorieDto categorie)
            throws ExceptionProduit {
            WsCatalogue port = serviceCatalogue.getWsCataloguePort();
            List<ProduitDto> liste 
                    = port.getProduitsByCategorie(categorie);
            if (liste == null) {
                throw new ExceptionProduit("liste de produits null");
            }
            return liste;
    }
        //    // ===========================================================
        //    //                  GESTION DES COMMANDES
        //    // ===========================================================
        //
        //    /**
        //     * Permet d'appeler la méthode créerCommande du webservice WsCommande pour
        //     * créer une commande
        //     *
        //     * @param commandeDto
        //     * @return
        //     */
        //    @WebMethod(operationName = "validerCommande")
        //    public void validerCommande(@WebParam(name = "commande")
        //            final CommandeDto commandeDto) {
        //        creerCommande(commandeDto);
        //    }
        //
        //    /**
        //     * Permet de récupérer la liste des commandes d'un utilisateur
        //     *
        //     * @param utilisateurDto
        //     * @return la liste des commandes d'un utilisateur
        //     */
        //    @WebMethod(operationName = "getListeCommandesByUtilisateur")
        //    public List<CommandeDto> getListeCommandesByUtilisateur(
        //            @WebParam(name = "utilisateurDto")
        //            final fr.afcepf.projet2.facade
        //                    .serviceweb.commandes.UtilisateurDto utilisateurDto) {
        //        List<CommandeDto> listeCommandeDto
        //                = getCommandeByClient(utilisateurDto);
        //        return listeCommandeDto;
        //    }

//    // ===========================================================
//    //                  GESTION DES COMMANDES
//    // ===========================================================
//
//    /**
//     * Permet d'appeler la méthode créerCommande du webservice WsCommande pour
//     * créer une commande
//     *
//     * @param commandeDto
//     * @return
//     */
//    @WebMethod(operationName = "validerCommande")
//    public void validerCommande(@WebParam(name = "commande")
//            final CommandeDto commandeDto) {
//        creerCommande(commandeDto);
//    }
//
//    /**
//     * Permet de récupérer la liste des commandes d'un utilisateur
//     *
//     * @param utilisateurDto
//     * @return la liste des commandes d'un utilisateur
//     */
//    @WebMethod(operationName = "getListeCommandesByUtilisateur")
//    public List<CommandeDto> getListeCommandesByUtilisateur(
//            @WebParam(name = "utilisateurDto")
//            final fr.afcepf.projet2.facade
//                    .serviceweb.commandes.UtilisateurDto utilisateurDto) {
//        List<CommandeDto> listeCommandeDto 
//                = getCommandeByClient(utilisateurDto);
//        return listeCommandeDto;
//    }

//    /**
//     * Permet de récupérer une commande à partir de sont identifiant
//     *
//     * @param idCommande
//     * @return la commande correspondante
//     */
//    @WebMethod(operationName = "getCommandeParId")
//    public CommandeDto getCommandeParId(
//            @WebParam(name = "idCommande") final int idCommande) {
//        CommandeDto commandeDto = getCommandeById(idCommande);
//        return commandeDto;
//    }
//
//    /**
//     * Permet de récupérer la liste des lignes de ccommande pour une commande
//     * @param commandeDto
//     * @return la liste des lignes de commande correspondante
//     */
//    public List<LigneCommandeDto> getLignesCommande(
//            final CommandeDto commandeDto) {
//        List<LigneCommandeDto> listeLigneCommande
//                = getLignesCommandes(commandeDto);
//        return listeLigneCommande;
//    }
//
//    private void creerCommande(final CommandeDto commande) {
//        WsCommandes port = serviceCommande.getWsCommandesPort();
//        port.creerCommande(commande);
//    }

//    private java.util.List<CommandeDto> getCommandeByClient(
//            final fr.afcepf.projet2.facade.
//                    serviceweb.commandes.UtilisateurDto utilisateur) {
//        WsCommandes port = serviceCommande.getWsCommandesPort();
//        return port.getCommandeByClient(utilisateur);
//    }

//    private CommandeDto getCommandeById(int idCommande) {
//        WsCommandes port = serviceCommande.getWsCommandesPort();
//        return port.getCommandeById(idCommande);
//    }
//
//    private java.util.List<LigneCommandeDto> getLignesCommandes(
//            final CommandeDto commande) {
//        WsCommandes port = serviceCommande.getWsCommandesPort();
//        return port.getLignesCommandes(commande);
//    }
    /* =======================================================================
     * =                              Comptes                                =
     * =                                                                     =
     * =    Auteur : Alexandre Boff                                          =
     * =======================================================================*/
    
    /** Ajoute un client en base de donnée
     * 
     * @param client DTO utilisateur du client à sauvegarder.
     * Attention ! On présume que l'attribut &quot;site&quot; a été setté dans le ManagedBean
     * @return DTO Utilisateur du client sauvegardé (l'Id a été settée)
     * @throws DaoGenericException_Exception Exception de la DAO
     * @throws InformationManquanteException_Exception Exception en cas d'information manquante
     */
    @WebMethod(operationName = "ajoutClient")
    public UtilisateurDto ajoutClient(
            @WebParam(name="client") UtilisateurDto client,
            @WebParam(name="adresse")AdresseDto adresse, 
            @WebParam(name="civilite")final String civilite)
            throws InformationManquanteException_Exception{ 
        WsComptes webService = serviceComptes.getWsComptesPort();
      
        CiviliteDto civiliteDto = new CiviliteDto();
        if (!"".equals(civilite))
        {
           civiliteDto =  getCiviliteByNom(civilite);
        }else{
           civiliteDto = getCiviliteByNom("Indeterminé");
        }
        client.setCivilite(civiliteDto);
        TypeUtilisateurDto typeUtilisateur = 
                getTypeUtilisateursByNom("client");
        client.setTypeUtilisateur(typeUtilisateur);
        client.getAdresse().add(adresse);
        if (client!=null){
                
             client = webService.ajoutClient(client);
        }
       
//        if (client.getIdUtilisateur() !=null && adresse !=null){
//             adresse = webService
//                     .enregistrerAdresse(
//                     adresse,client.getIdUtilisateur());
//             client.getAdresse().add(adresse);
//        }
         return client;
    }
    
    /** Récupère un client à partir de son email
     * @param email objet de recherche
     * @return DTO Utilisateur recherché
     * @throws InformationManquanteException_Exception Exception en cas d'information manquante
     */
    @WebMethod(operationName="getClientByEmail")
    public UtilisateurDto getClientByEmail(
            @WebParam(name="email")final String email)
      throws InformationManquanteException_Exception,
      UtilisateurInexistantException_Exception {
        WsComptes webService = serviceComptes.getWsComptesPort();
        return webService.getByEmail(email);
    }
    
    /** Récupère un client à partir de son Id
     * @param id Objet de la recherche
     * @return DTO Utilisateur du client recherché
     * @throws DaoGenericException_Exception Exception en cas d'erreur de la DAO
     */
    @WebMethod(operationName="getClientById")
    public UtilisateurDto getClientById(final int id) 
            throws UtilisateurInexistantException_Exception  {
        WsComptes webService = serviceComptes.getWsComptesPort();
        return webService.getById(id);
    }
    
    /** Met à jour les informations d'un client en base de données
     * @param client Client dont les nouvelles données sont à enregistrer
     * @throws DaoGenericException_Exception Exception en cas d'erreur de DAO
     */
    @WebMethod(operationName="modifierClient")
    public void modifierClient(
            @WebParam(name="client")final UtilisateurDto client) {
        WsComptes webService = serviceComptes.getWsComptesPort();
        webService.modifierClient(client);
    }
    
    /** Login de l'utilisateur
     * @param login login, en l'occurence l'email de l'utilisateur
     * @param password mot de passe
     * @return DTO Utilisateur de l'utilisateur connecté
     * @throws Exception_Exception Exception soulevée
     */
    @WebMethod(operationName="login")
    public UtilisateurDto login(
            @WebParam(name="email")final String email,
            @WebParam(name="password")final String password) 
            throws InformationManquanteException_Exception,
            MotDePasseIncorrectException_Exception,
            UtilisateurInexistantException_Exception{
       WsComptes webService = serviceComptes.getWsComptesPort();
       return webService.connectionClient(email, password);
    }
    
//    /** Récupère toutes les civilités pour l'affichage
//     * @return List de DTO de Civilités
//     */
//    @WebMethod(operationName="getAllCiviliteDtos")
//    public List<CiviliteDto> getAllCiviliteDtos() {
//       WsComptes webService = serviceComptes.getWsComptesPort();
//       return webService.getAllCivilite();
//    }
//    
//    /** Récupère tous les types d'utilisateurs pour l'affichage
//     * @return List de DTO de Types d'utilisateurs
//     */
//    @WebMethod(operationName="getAllTypeUtilisateursDtos")
//    public List<TypeUtilisateurDto> getAllTypeUtilisateursDtos() {
//        WsComptes webService = serviceComptes.getWsComptesPort();
//       return webService.getAllTypeUtilisateur();
//    }

    /**
     * 
     * @param nomCivilite
     * @return 
     */
    @WebMethod(operationName="getCiviliteByNom")
    public CiviliteDto getCiviliteByNom(
            @WebParam(name="nomCivilite")final String nomCivilite){
        WsComptes webService = serviceComptes.getWsComptesPort();
       return webService.getCiviliteParNom(nomCivilite);
    }
    
    /**
     * 
     * @param nomTypeUtilisateur
     * @return 
     */
        @WebMethod(operationName="getTypeUtilisateursByNom")
    public TypeUtilisateurDto getTypeUtilisateursByNom(
                @WebParam(name="nomTypeUtilisateur")final String nomTypeUtilisateur){
        WsComptes webService = serviceComptes.getWsComptesPort();
       return webService.getTypeUtilisateurParNom(nomTypeUtilisateur);
    }
}
